<?php
strtolower(basename($_SERVER['PHP_SELF'])) == 'mysql.class.php' && header('Location:http://' . $_SERVER['HTTP_HOST']); //禁止直接访问本页

class MySql{
	private $host;					// 数据库主机.
	private $user;					// 数据库用户名.
	private $pass;					// 数据库密码.
	private $data;					// 数据库名.
	private $conn;					// 数据库连接标识,0为mysql_connect,1为mysql_pconnect.
	private $sql;					// sql语句.
	private $code;					// 数据库编码,GBK,UTF8,GB2312.
	public  $result;				// 执行query命令的结果数据集.

	public  $errTip   = 'on';		// 是否开启错误提示,具有安全隐患,默认开启,建议仅在本地调试时使用.
	public  $errLog   = 'on';		// 是否开启错误日志,默认开启,推荐开启.
	public  $errDir   = 'error';	// 错误日志保存路径,须开启错误日志才有效,可以在类实例化以后自定义.

	public  $numRows  = 0;			// 总记录.
	private $pageAll  = 1;			// 总页数.
	private $pageNow  = 1;			// 当前页.
	private $pageSize = 10;			// 每页显示记录条数.

	/*------------------------------------------------------------------
	 * 函数名:	__construct($host, $user, $pass, $data, $code, $conn)
	 * 作　用:	构造函数
	 * 参　数:	$host 数据库主机地址(必填)
				$user 数据库用户名(必填)
				$pass 数据库密码(必填)
				$data 数据库名(必填)
				$code 数据库编码(必填,默认为utf8)
				$conn 数据库连接标识,0(默认)为mysql_connect,1为mysql_pconnect(选填)
	 * 返回值:	无 
	 * 实　例:	无
	-------------------------------------------------------------------*/
	public function __construct($host = 'localhost', $user = 'root', $pass = '123456', $data = 'student', $code = 'utf8', $conn = 0) {
		$this->host = $host;
		$this->user = $user;
		$this->pass = $pass;
		$this->data = $data;
		$this->conn = $conn;
		$this->code = $code;
		$this->connect();
	}

	// 访问一个对象并不拥有的属性(私有属性)
	public function __get($property) {
		return $this->$property;
	}

	// 设置一个对象并不拥有的属性(私有属性)
	public function __set($property, $value) {
		$this->$property = $value;
	}

	// 数据库连接
	private function connect() {
		if ($this->conn == 1) {
			$this->conn = mysql_pconnect($this->host, $this->user, $this->pass); // 永久链接
		} else {
			$this->conn = mysql_connect($this->host, $this->user, $this->pass);  // 临时链接
		}
		if (!$this->conn) {
			$this->showError('无法连接服务器');
		}
		$this->selectDb($this->data);
		$this->query("SET NAMES {$this->code}");
		$this->query("SET CHARACTER_SET_CLIENT={$this->code}"); 
		$this->query("SET CHARACTER_SET_RESULTS={$this->code}");
	}

	// 数据库选择
	public function selectDb($db = '') {
		if (empty($db)) {
			$this->showError('未设置数据库名称');
		}
		$result = mysql_select_db($db, $this->conn);
		if (!$result) {
			$this->showError('无法连接数据库'.$db);
		}
		return $result;
	}

	/*------------------------------------------------------------------
	 * 函数名:	getInfo($type)
	 * 作　用:	取得 MySQL 服务器信息
	 * 参　数:	$type 要获取的信息类型(选填)
	 * 返回值:	字符串
	 * 实　例:	无
	-------------------------------------------------------------------*/
	public function getInfo($type = 0) {
		switch ($type) {
			case 1  : return mysql_get_host_info();   // 取得 MySQL 主机信息
			case 2  : return mysql_get_proto_info();  // 取得 MySQL 协议信息
			case 3  : return mysql_get_server_info(); // 取得 MySQL 服务器信息
			default : return mysql_get_client_info(); // 取得 MySQL 客户端信息
		}
	}

	/*------------------------------------------------------------------
	 * 函数名:	query($sql)
	 * 作　用:	数据库执行语句,可执行查询添加修改删除等任何sql语句
	 * 参　数:	$sql sql语句(必填)
	 * 返回值:	布尔
	 * 实　例:	无
	-------------------------------------------------------------------*/
	public function query($sql) {
		$sql = trim($sql);
		if (empty($sql)) {
			$this->showError('SQL语句为空');
		}
		$this->sql = $sql;
		$this->result = mysql_query($this->sql, $this->conn);
		if (!$this->result) {
			$this->showError('SQL语句有误', true);
		}
		return $this->result;
	}

	/*------------------------------------------------------------------
	 * 函数名:	createDataBase($db)
	 * 作　用:	创建添加新的数据库
	 * 参　数:	$db 数据库名称(必填)
	 * 返回值:	字符串
	 * 实　例:	无
	-------------------------------------------------------------------*/
	public function createDataBase($db = '') {
		if (empty($db)) {
			$this->showError('未设置待添加的数据库名称');
		}
		$this->query("CREATE DATABASE `{$db}`");
	}

	// 列出当前服务器中的所有数据库
	public function listDataBase() {
		$list = array();
		$this->query('SHOW DATABASES');
		while ($row = $this->fetch()) {
			$list[] = $row['Database'];
		}
		return $list;
	}

	// 列出数据库中的所有表
	public function listTables($db = '') {
		$list = array();
		if (!empty($db)) {
			$db = ' FROM `'.$db.'`';
		}
		$this->query('SHOW TABLES'.$db);
		while ($row = $this->fetch('', 2)) {
			$list[] = $row[0];
		}
		return $list;
	}
	
	// 列出表中的所有字段名
	public function listFields($db = '', $tb = '') {
		if (empty($table)) {
			return false;
		}
		if (empty($db)) {
			$db = $this->data;
		}
		$fields = mysql_list_fields($db, $tb, $this->conn);
		$column = mysql_num_fields($fields);
		$list   = array();		
		for ($i = 0; $i < $column; $i++) {
			$list[] = mysql_field_name($list, $i);
		}
		return $list;
	}

	/*------------------------------------------------------------------
	 * 函数名:	copyTable($dstTable, $srcTable, $condition)
	 * 作　用:	复制表
	 * 参　数:	$dstTable 待复制表的表名(必填)
				$srcTable 新表名(必填)
				$condition 复制条件(选填)
	 * 返回值:	布尔
	 * 实　例:	无
	-------------------------------------------------------------------*/
	public function copyTable($dstTable, $srcTable, $condition = '') {
		return $this->query("SELECT * INTO `{$dstTable}` FROM `{$srcTable}` {$condition}");
	}

	/*------------------------------------------------------------------
	 * 函数名:	dropTable($table)
	 * 作　用:	删除表(请慎用,无法恢复)
	 * 参　数:	$table 要删除的表名,多个表请用数组,为空表示保存所有表信息(选填)
	 * 返回值:	无
	 * 实　例:	$DB->dropTable('mydb')
	-------------------------------------------------------------------*/
	public function dropTable($table = '') {
		if (!is_array($table)) {
			$table = empty($table) ? $this->listTables($this->data) : array($table);
		}
		foreach ($table as $tb) {
			$this->query("DROP TABLE IF EXISTS `{$tb}`");
		}
	}

	/*------------------------------------------------------------------
	 * 函数名:	getData($table, $fileds, $condition, $rows)
	 * 作　用:	查询数据
	 * 参　数:	$table 表名(必填)
				$fileds 字段名,默认为所有(选填)
				$condition 查询条件(选填)
				$rows 待查询记录条数,为0表示不限制(选填)
	 * 返回值:	布尔
	 * 实　例:	$DB->getData('mydb','user,password','order by id desc',10)
	-------------------------------------------------------------------*/
	public function getData($table, $fileds = '', $condition = '', $rows = 0) {
		$table = '`'.strtr($table, array(' ' => '', '.' => '`.`', ',' => '`, `')).'`';
		if (empty($fileds)) {
			$fileds = '*';
		}
		if ($rows > 0) {
			$condition .= " LIMIT 0,{$rows}";
		}
		$sql = "SELECT {$fileds} FROM {$table} {$condition}";
		$res = $this->query($sql);
		$this->numRows();
		return $res;
	}

	// 只查询一条记录,返回关联数组
	public function getRows($table, $fileds = '*', $condition = '') {
		$table = '`'.strtr($table, array(' ' => '', '.' => '`.`', ',' => '`, `')).'`';
		if (empty($fileds)) {
			$fileds = '*';
		}
		$this->query("SELECT {$fileds} FROM {$table} {$condition} LIMIT 0,1");
		return $this->fetch();
	}

	/*------------------------------------------------------------------
	 * 函数名:	addData($table, $data, $values)
	 * 作　用:	添加数据
	 * 参　数:	$table 表名(必填)
				$data 待添加数据,推荐使用数组类型(必填)
				$values 待添加数据值,如果为字符串时使用(选填)
	 * 返回值:	布尔
	 * 实　例:	$DB->addData('mydb',array('user'=>'admin','password'=>'123456','age'=>'18') 数组类型(提示: 这里可以直接用$_POST或者$_GET)
				$DB->addData('mydb','`user`,`password`,`age`',"'admin','123456','18'" 字符串类型
	-------------------------------------------------------------------*/
	public function addData($table = '', $data = array(), $values = '') {
		if (empty($table)) {
			$this->showError('待添加数据表名为空');
		}
		$table = '`'.strtr($table, array(' ' => '', '.' => '`.`', ',' => '`, `')).'`';
		if (empty($data)) {
			$this->showError('待添加数据为空');
		}
		if (is_array($data)) {
			$values = '';
			$fileds = '';
			foreach ($data as $key => $val) {
				$key = trim($key);
				if (!empty($key)) {
					$fileds .= "`{$key}`,";
					$values .= $val ? "'".mysql_real_escape_string($val)."'," : '"",';
				}
			}
			$fileds = rtrim($fileds, ',');
			$values = rtrim($values, ',');
		} else {
			$fileds = $data;
		}
		//$sql="INSERT INTO {$table} ({$fileds}) VALUES ({$values})";
		//echo $sql;exit;
		return $this->query("INSERT INTO {$table} ({$fileds}) VALUES ({$values})");
	} 

	/*------------------------------------------------------------------
	 * 函数名:	setData($table, $data, $condition, $unQuot)
	 * 作　用:	更改数据
	 * 参　数:	$table 表名(必填)
				$data 待更改数据,可以为数组(必填)
				$condition 更改条件(选填)
				$unQuot 不需要加引号的字段,用于字段的加减运算等情况,多个字段用,分隔或者写入一个数组(选填)
	 * 返回值:	布尔
	 * 实　例:	$DB->setData('mydb',array('user'=>'admin','password'=>'123456','WHERE id=1') 数组类型
				$DB->setData('mydb',"user='admin',password='123456'",'WHERE id=1') 字符串类型
	-------------------------------------------------------------------*/
	public function setData($table = '', $data = '', $condition = '', $unQuot = array()) {
		if (empty($table)) {
			$this->showError('待修改数据表名为空');
		}
		$table = '`'.strtr($table, array(' ' => '', '.' => '`.`', ',' => '`, `')).'`';
		if (empty($data)) {
			$this->showError('待修改数据为空');
		}
		if (is_array($data)) {
			$unQuot = is_array($unQuot) ? $unQuot : explode(',', $unQuot);
			foreach ($data as $key => $val) {
				$val = mysql_real_escape_string($val);
				$values .= '`'.$key.'`='.(in_array($key, $unQuot) ? "{$val}," : "'{$val}',");
			}
			$values = rtrim($values, ',');
		} else {
			$values = $data;
		}
		return $this->query("UPDATE {$table} SET {$values} {$condition}");
	}

	/*------------------------------------------------------------------
	 * 函数名:	delData($table, $condition)
	 * 作　用:	删除数据
	 * 参　数:	$table 表名(必填)
		     	$condition 删除条件(选填)
	 * 返回值:	布尔
	 * 实　例:	$DB->delData('mydb','id=1')
	-------------------------------------------------------------------*/
	public function delData($table, $condition = '') {
		$table = '`'.strtr($table, array(' ' => '', '.' => '`.`', ',' => '`, `')).'`';
		return $this->query("DELETE FROM {$table}".($condition ? " WHERE {$condition}" : ''));
	}

	/*------------------------------------------------------------------
	 * 函数名:	fetch($result, $type, $arrType)
	 * 作　用:	根据从结果集取得的行生成数组
	 * 参　数:	$result 结果集(选填)
		     	$type 返回的数组类型,1为mysql_fetch_assoc,2为mysql_fetch_row,3为mysql_fetch_object,默认为mysql_fetch_array(选填)
				$arrType 用于mysql_fetch_array,可以接受以下值: MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(选填)
	 * 返回值:	布尔
	 * 实　例:	无
	-------------------------------------------------------------------*/
      
	public function fetch($result = '', $type = '', $arrType = MYSQL_BOTH) {
		if (empty($result)) {
			$result = $this->result;
		}
		if (!$result) {
			$this->showError('未获取到查询结果', true);
		}
		switch ($type) {
			case 1: // 获取关联数组,使用$row['字段名']
				return mysql_fetch_assoc($result);
			case 2: // 获取数字索引数组,使用$row[0],$row[1],$row[2]
				return mysql_fetch_row($result);
			case 3: // 获取对象数组
				return mysql_fetch_object($result);
			default: // 关联数组，或数字数组，或二者兼有
				return mysql_fetch_array($result, $arrType);
		}
	}

	// 取得结果数据
	public function result($result = '', $rows = 0, $field = '') {
		if (empty($result)) {
			$result = $this->result;
		}
		if (!$result) {
			$this->showError('未获取到查询结果', true);
		}
		return mysql_result($result, $rows, $field);
	}
        
    
    /*------------------------------------------------------------------
	函数名:	numFields($result)
	作　用:	查询字段数量
	参　数:	$result 结果集(选填)
	返回值:	字符串
	实　例:	$DB->num_fields("mydb")
	-------------------------------------------------------------------*/
	public function numFields($result = '') {
		if (empty($result)) {
			$result = $this->result;
		}
		if (!$result) {
			$this->showError('未获取到查询结果', true);
		}
		return mysql_num_fields($result);
	}
    public function numcount($num){
        return mysql_num_rows($num);
    }
	// 根据select查询结果计算结果集条数 
	public function numRows($result = '') { 
		if (empty($result)) {
			$result = $this->result;
		}
		if (!$result) {
			$this->showError('未获取到查询结果', true);
		}
		$rows = mysql_num_rows($result);
		$this->numRows = $rows > 0 ? $rows : 0;
		return $this->numRows;
	}

	// 根据insert,update,delete执行结果取得影响行数 
	public function status() {
		return mysql_affected_rows();

	}

	// 取得上一步INSERT 操作产生的ID
	public function insertId() {
		return mysql_insert_id();
	}

	// 指向确定的一条数据记录
	public function dataSeek($result, $id = 0) {
		if (empty($result)) {
			$result = $this->result;
		}
		if (!$result) {
			$this->showError('未获取到查询结果', true);
		}
		if ($id > 0) {
			$id = $id - 1;
		}
		if (!mysql_data_seek($this->result, $id)) {
			$this->showError('指定的数据不存在');
		}
		return $this->result; 
	}

	/*------------------------------------------------------------------
	 * 函数名:	getQuery($unset)
	 * 作　用:	获取地址栏参数,主要用于分页时传递地址栏其它参数
	 * 参　数:	$unset 不需要传递的参数,多个参数请用英文逗号分隔(选填)
	 * 返回值:	字符串
	 * 实　例:	getQuery('page,sort')
	-------------------------------------------------------------------*/
	public function getQuery($unset = '') {
		$list = array();
		$keys = explode(',', $unset);
		foreach ($_GET as $key => $val) {
			if (!in_array($key, $keys)) {
				$list[] = $key.'='.urlencode($val);
			}
		}
		return implode('&amp;', $list);
	}

	// 获得客户端真实的IP地址
	public function getIP() {
		if (@$_SERVER['HTTP_X_FORWARDED_FOR']) {
			return $_SERVER['HTTP_X_FORWARDED_FOR'];
		} elseif (@$_SERVER['HTTP_CLIENT_IP']) {
			return $_SERVER['HTTP_CLIENT_IP'];
		} elseif ($_SERVER['REMOTE_ADDR']) {
			return $_SERVER['REMOTE_ADDR'];
		} elseif (getenv('HTTP_X_FORWARDED_FOR')) {
			return getenv('HTTP_X_FORWARDED_FOR');
		} elseif (getenv('HTTP_CLIENT_IP')) {
			return getenv('HTTP_CLIENT_IP');
		} elseif (getenv('REMOTE_ADDR')) {
			return getenv('REMOTE_ADDR');
		}
		return '';
	}

	/*------------------------------------------------------------------
	 * 函数名:	makeSql($table)
	 * 作　用:	从数据表读取信息并生成SQL语句
	 * 参　数:	$table 待读取的表名(必填)
	 * 返回值:	字符串
	 * 实　例:	无
	-------------------------------------------------------------------*/
	public function makeSql($table = '') {
		if (empty($table)) {
			$this->showError('待读取表名为空');
		}
		$result = $this->query("SHOW CREATE TABLE `{$table}`");
		$row 	= $this->fetch($result, 2);
		$sqlStr = '';
		if ($row) {
			$sqlStr .= "-- --------------------------------------------\r\n";
			$sqlStr .= "-- Table structure for `{$table}`\r\n";
			$sqlStr .= "-- --------------------------------------------\r\n";
			$sqlStr .= "DROP TABLE IF EXISTS `{$table}`;\r\n{$row[1]};\r\n";
			$this->getData($table);
			$fields = $this->numFields();
			$sqlStr .= "\r\n";
			if ($this->numRows() > 0) {
				$sqlStr .= "-- --------------------------------------------\r\n";
				$sqlStr .= "-- Records of `{$table}`\r\n";
				$sqlStr .= "-- --------------------------------------------\r\n";
				while ($row  = $this->fetch('', 2)) {
					$sqlStr .= "INSERT INTO `{$table}` VALUES (";
					for ($i  = 0; $i < $fields; $i++) {
						$sqlStr .= "'".mysql_escape_string($row[$i])."',";
					}
					$sqlStr = rtrim($sqlStr, ',').");\r\n";
				}
			}
		}
		return $sqlStr;
	}

	/*------------------------------------------------------------------
	 * 函数名:	readSql($filePath)
	 * 作　用:	读取SQL文件并过滤注释
	 * 参　数:	$filePath SQL文件路径(必填)
	 * 返回值:	字符串(错误信息) or 数组
	 * 实　例:	无
	-------------------------------------------------------------------*/
	public function readSql($filePath) {
		if (!file_exists($filePath)) {
			$this->showError($filePath.'不存在');
		}
		$sql = file_get_contents($filePath);
		if (empty($sql)) {
			$this->showError($filePath.'中无有效数据');
		}
		// 过滤注释,并将两个以上的连续空格替换为一个
		$sql = preg_replace(array('/\/\*.*\*\//s', '/(^|\s)+--.*/', '/ {2,}/'), array('', '', ' '), $sql);
		$sql = preg_split('/;[\n\r]+/', $sql, -1, PREG_SPLIT_NO_EMPTY);
		return array_map('trim', $sql);
	}

	/*------------------------------------------------------------------
	 * 函数名:	saveSql($sqlPath, $table)
	 * 作　用:	将当前数据库信息保存为SQL文件,可以分段保存(主要用于数据量比较大的数据库)
	 * 参　数:	$sqlPath SQL文件保存路径,如果为空则自动以当前日期为文件名并保存到当前目录(选填)
		     	$table 待保存的表名,多个表请用数组,为空表示保存所有表信息(选填)
				$rows 多少条语句为一段，为0则不分段。
	 * 返回值:	字符串
	 * 实　例:	$DB->saveSql('../mydb.sql');
	-------------------------------------------------------------------*/
	public function saveSql($sqlPath = '', $table = '', $rows = 0) {
		$sql = '';
		if (!is_array($table)) {
			$table = empty($table) ? $this->listTables($this->data) : array($table);
		}
		foreach ($table as $tb){
			$sql .= $this->makeSql($tb);
		}
		if (empty($sql)) {
			return false;
		}
		$text  = "/******************************************************************\r\n";
		$text .= "  Database: {$this->data}\r\n";
		$text .= "  Date Created: ".date('Y-m-d H: i: s')."\r\n";
		$text .= "*******************************************************************/\r\n\r\n";
		$text .= $sql;
		$info  = pathinfo($sqlPath);
		$dirs  = $info['dirname'];
		if (empty($info['extension'])) {
			$dirs = empty($sqlPath) ? '' : rtrim($sqlPath, '/').'/';
			$sqlPath = $dirs.date('YmdHis').'.sql';
		}
		$this->makeDirs($dirs);
		if ($rows > 0) {
			$sql  = preg_split('/;[\r\n]+/', $text, -1, PREG_SPLIT_NO_EMPTY);
			$sql  = array_chunk($sql, $rows);
			$num  = 1;
			$ext  = pathinfo($sqlPath, PATHINFO_EXTENSION);
			$path = rtrim($sqlPath, ".$ext");
			foreach ($sql as $str) {
				$file = $path.'('.$num++.').'.$ext;
				$link = fopen($file, 'w+');
				fwrite($link, implode(";\r\n", $str).";\r\n");
				fclose($link);
			}
		} else {
			$link = fopen($sqlPath, 'w+');
			fwrite($link, $text);
			fclose($link);
		}
	}

	/*------------------------------------------------------------------
	 * 函数名:	loadSql($filePath)
	 * 作　用:	将SQL文件信息导入到数据库
	 * 参　数:	$sqlFile SQL文件路径(必填)
	 * 返回值:	字符串(未成功执行的sql语句)
	 * 实　例:	$DB->loadSql('../mydb.sql');
	-------------------------------------------------------------------*/
	public function loadSql($sqlFile = '') {
		if (empty($sqlFile)) {
			$this->showError('SQL文件路径为空');
		}
		$err_list = '';
		$info = $this->readSql($sqlFile);
		foreach ($info as $sql) {
			if (@mysql_query($sql)) {
				$err_list .= $sql.'<br />';
			}
		}
		return empty($err_list) ? '' : '下列语句执行失败:<br />'.$err_list;
	}

	// 自动建立多级目录,主要是为了给错误日志和导出SQL文件提供支持.
	public function makeDirs($dirs = '', $mode = '0777') {
		$dirs = strtr(trim($dirs), '\\', '/');
		if (!empty($dirs) && !is_dir($dirs)) {
			$this->makeDirs(dirname($dirs));
			if (!mkdir($dirs, $mode)) {
				$this->showError('建立目录'.$dirs.'失败,请尝试手动建立!');
			}
		}
	}

	/*------------------------------------------------------------------
	 * 函数名:	showError($msg, $sql)
	 * 作　用:	输出显示错误信息
	 * 参　数:	$msg 错误信息(必填)
				$sql 是否显示错误的SQL语句,在SQL语句错误时使用(选填)
	 * 返回值: 字符串
	 * 实　例: 无
	-------------------------------------------------------------------*/
	public function showError($msg = '', $sql = false) {
		$err='['.mysql_errno().']'.mysql_error();
		if ($sql) {
			$sql = 'SQL 语句: '.$this->sql;
		}
		if ($this->errLog == 'on') {
			$dir = rtrim($this->errDir, '/');
			$this->makeDirs($dir);
			$filePath = $dir.'/'.date('Y-m-d').'.log';
			$log  = "错误事件: {$msg}\r\n";
			$log .= "错误原因: {$err}\r\n";
			$log .= $sql ? "{$sql}\r\n" : '';
			$log .= "客户端IP: ".$this->getIP()."\r\n";
			$log .= "记录时间: ".date('Y/m/d H:i:s')."\r\n\r\n";
			$log  = '错误日志: __'.(error_log($log, 3, $filePath) ? '此错误信息已被自动记录到日志'.$filePath : '写入错误信息到日志失败');
		}
		if ($this->errTip == 'on') {
			$tip  = '<fieldset class="errlog">';
			$tip .= '<legend>错误信息提示</legend>';
			$tip .= '<label class="tip">错误事件: '.$err.'</label>';
			$tip .= '<label class="msg">错误原因: '.$msg.'</label>';
			$tip .= '<label class="sql">'.$sql.'</label>';
			$tip .= '<label class="log">'.$log.'</label>';
			$tip .= '</fieldset>';
			die ($tip);
		}
	}

	// 释放结果集
	public function free($result = '') {
		if (empty($result)) {
			$result = $this->result;
		}
		@mysql_free_result($result);
	}

	// 关闭数据库
	public function close($conn = '') {
		if (empty($conn)) {
			$conn = $this->conn;
		}
		@mysql_close($conn);
	}
	
	//截取字符口串
    function sub_str($str, $length = 0, $append = true)
    {
        $str = trim($str);         // 使用trim()去掉原始字符串首位的空白字符
        $strlength = strlen($str); // 取得原始字符串的长度
        // 如果目标长度为零或目标长度大于原始长度
        // 不用处理，直接返回
        if ($length == 0 || $length >= $strlength)
        {
            return $str;
        }
        // 如果目标长度小于零，用原始长度减去目标长度作为新的目标长度
        // 如果目标长度仍然小于零，直接取原始长度(这样有何用意?)
        elseif ($length < 0)
        {
            $length = $strlength + $length;
            if ($length < 0)
            {
                $length = $strlength;
            }
        }
        // 如果mb_substr函数存在，使用其截取
        // 否则如果iconv_substr函数存在，使用其截取
        // 否则使用substr函数截取
        if (function_exists('mb_substr'))
        {
            $newstr = mb_substr($str, 0, $length, 'utf-8');
        }
        elseif (function_exists('iconv_substr'))
        {
            $newstr = iconv_substr($str, 0, $length, utf-8);
        }
        else
        {
            //$newstr = trim_right(substr($str, 0, $length));
            $newstr = substr($str, 0, $length);
        }
        // 如果需要加省略号并且原始字符串和新字符串不相等，在新字符串后加'...'
        if ($append && $str != $newstr)
        {
            $newstr .= '--!';
        }
    // 返回新的字符串
        return $newstr;
    }
    //截取字符串
   
   public function showBox($title,$messageurl,$backurl)
   {
       return header("location:$messageurl?title=$title&backurl=$backurl");
   }
   
	//php 批量过滤post,get敏感数据
	function stripslashes_array(&$array) {
		while(list($key,$var) = each($array)) {
		if ($key != 'argc' && $key != 'argv' && (strtoupper($key) != $key || ''.intval($key) == "$key")) {
		if (is_string($var)) {
		$array[$key] = stripslashes($var);
		}
		if (is_array($var))  {
		$array[$key] = stripslashes_array($var);
		}
		}
		}
	return $array;
	}
	
	public function strsafe($str)
	{
		$handlestr= addslashes(trim($str));
		return $handlestr;
	}
        
	public function parenturl($withget=0)//获取当前地址
	{
		if($withget==0)
		{
			$url="http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];//获取不带参数的当前url
			return $url;
		}
		else
		{
			$url="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];//获取带参数的当前url
			return $url;
		}
	}

	// 析构函数,自动释放结果集、关闭数据库,垃圾回收机制
	public function __destruct() {
		$this->free();
		$this->close();
	}

}
?>